package ongd.servicios.persistencia;

import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import ongd.negocio.gestion.Entidad;
import ongd.negocio.gestion.Proyecto;
import ongd.negocio.gestion.Subvencion;
import ongd.negocio.gestion.SubvencionPK;
import ongd.servicios.persistencia.exceptions.NonexistentEntityException;
import ongd.servicios.persistencia.exceptions.PreexistingEntityException;

/**
 * Clase que contiene los método que para realizar operaciones
 * sobre la base de datos referente a la entidad subvencion.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
public class SubvencionJpaController extends AJPAControlador implements Serializable {

    /**
     * Objeto de tipo EntityManager.
     */
    private EntityManager em = null;

    /**
     * Constructor de la clase.
     * @param em EntityManager
     */
    public SubvencionJpaController(EntityManager em) {
        this.em = em;
    }

    /**
     * Método que crea un objeto de tipo subvencion en la base de datos.
     * @param entidad Objeto que crearemos 
     * @param et Booleano que indica si hay que iniciar la transacción
     * @throws PreexistingEntityException
     * @throws Exception 
     */
    @Override
    public void create(Entidad entidad, boolean et) throws PreexistingEntityException, Exception {
        Subvencion subvencion = (Subvencion) entidad;
        if (subvencion.getSubvencionPK() == null) {
            subvencion.setSubvencionPK(new SubvencionPK());
        }
        subvencion.getSubvencionPK().setProyectoidProyecto(subvencion.getProyecto().getIdProyecto());
        try {
            //Si et es falso significa que tengo que crear la transacción
            if (!et) {
                em.getTransaction().begin();
            }
            Proyecto proyecto = subvencion.getProyecto();
            if (proyecto != null) {
                proyecto = em.getReference(proyecto.getClass(), proyecto.getIdProyecto());
                subvencion.setProyecto(proyecto);
            }
            em.persist(subvencion);
            if (proyecto != null) {
                proyecto.getSubvencionList().add(subvencion);
                proyecto = em.merge(proyecto);
            }
            //Si et es falso significa que tengo que terminar la transaccion
            if (!et) {
                em.getTransaction().commit();
            }
        } catch (Exception ex) {
            if (findEntidad(Subvencion.class, subvencion.getSubvencionPK()) != null) {
                throw new PreexistingEntityException("Subvencion " + subvencion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
//                em.close();
            }
        }
    }

    /**
     * Método que edita un objeto de tipo subvencion en la base de datos.
     * @param entidad Entidad que editaremos
     * @param et Booleano que indica si hay que iniciar la transacción
     * @throws NonexistentEntityException
     * @throws Exception 
     */
    @Override
    public void edit(Entidad entidad, boolean et) throws NonexistentEntityException, Exception {
        Subvencion subvencion = (Subvencion) entidad;
        subvencion.getSubvencionPK().setProyectoidProyecto(subvencion.getProyecto().getIdProyecto());
        try {
            //Si et es falso significa que tengo que crear la transacción
            if (!et) {
                em.getTransaction().begin();
            }
            Subvencion persistentSubvencion = em.find(Subvencion.class, subvencion.getSubvencionPK());
            Proyecto proyectoOld = persistentSubvencion.getProyecto();
            Proyecto proyectoNew = subvencion.getProyecto();
            if (proyectoNew != null) {
                proyectoNew = em.getReference(proyectoNew.getClass(), proyectoNew.getIdProyecto());
                subvencion.setProyecto(proyectoNew);
            }
            subvencion = em.merge(subvencion);
            if (proyectoOld != null && !proyectoOld.equals(proyectoNew)) {
                proyectoOld.getSubvencionList().remove(subvencion);
                proyectoOld = em.merge(proyectoOld);
            }
            if (proyectoNew != null && !proyectoNew.equals(proyectoOld)) {
                proyectoNew.getSubvencionList().add(subvencion);
                proyectoNew = em.merge(proyectoNew);
            }
            //Si et es falso significa que tengo que terminar la transaccion
            if (!et) {
                em.getTransaction().commit();
            }
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                SubvencionPK id = subvencion.getSubvencionPK();
                if (findEntidad(Subvencion.class, id) == null) {
                    throw new NonexistentEntityException("The subvencion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
//                em.close();
            }
        }
    }

    /**
     * Método que borra un objeto de tipo subvencion de la base de datos.
     * @param clase Clase correpondiente al objeto a borrar
     * @param id Clave primaria del objeto a borrar
     * @param et Booleano que indica si hay que iniciar la transaccion
     * @throws NonexistentEntityException 
     */
    @Override
    public void destroy(Class clase, Object id, boolean et) throws NonexistentEntityException {
        try {
            //Si et es falso significa que tengo que crear la transacción
            if (!et) {
                em.getTransaction().begin();
            }
            Subvencion subvencion;
            try {
                subvencion = (Subvencion) em.getReference(clase, id);
                subvencion.getSubvencionPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The subvencion with id " + id + " no longer exists.", enfe);
            }
            Proyecto proyecto = subvencion.getProyecto();
            if (proyecto != null) {
                proyecto.getSubvencionList().remove(subvencion);
                proyecto = em.merge(proyecto);
            }
            em.remove(subvencion);
            //Si et es falso significa que tengo que terminar la transaccion
            if (!et) {
                em.getTransaction().commit();
            }
        } finally {
            if (em != null) {
//                em.close();
            }
        }
    }

    /**
     * Método que busca una subvencion en la base de datos.
     * @param clase Class correspondiente al objeto a buscar
     * @param id Clave primaria del objeto a buscar
     * @return subvencion
     */
    @Override
    public Subvencion findEntidad(Class clase, Object id) {
        try {
            return (Subvencion) em.find(clase, id);
        } finally {
//            em.close();
        }
    }
}
